import _ from 'lodash'
import moment from 'moment'
import validator from './validator'
import store from '../vuex/store'

const helper = {
  reportyjqxdArray: [{ text: '清晰', value: true }, { text: '不清晰', value: false }],
  reportyjqxd(value) {
    const result = _.find(helper.reportyjqxdArray, ['value', value])
    return result ? result.text : result
  },

  reportjckcArray: [{ text: '是', value: true }, { text: '否', value: false }],
  reportjckc(value) {
    const result = _.find(helper.reportjckcArray, ['value', value])
    return result ? result.text : result
  },

  reportpeyjArray: [{ text: '是', value: true }, { text: '否', value: false }],
  reportpeyj(value) {
    const result = _.find(helper.reportpeyjArray, ['value', value])
    return result ? result.text : result
  },

  campaignCategoryArray: [{ text: '新注册', value: 'new_user' }, { text: '活动页', value: 'campaign' }, { text: '邀请', value: 'invitation' }],
  campaignCategory(value) {
    const result = _.find(helper.campaignCategoryArray, ['value', value])
    return result ? result.text : result
  },

  recipeTypeArray: [{ text: '远用处方', value: 'yuanyong' }, { text: '辅助处方', value: 'fuzhu' }],
  recipeType(value) {
    const result = _.find(helper.recipeTypeArray, ['value', value])
    return result ? result.text : result
  },

  reportCategoryArray: [{ text: 'PQ 验光', value: 'pq' }, { text: '用户上传', value: 'user' }],
  reportCategory(value) {
    const result = _.find(helper.reportCategoryArray, ['value', value])
    return result ? result.text : result
  },
  reportStatus(value) {
    const status = {
      normal: '正常',
      not_inputed: '未录入',
      not_reviewed: '未校对',
    }
    return status[value]
  },

  genderArray: [{ text: '男', value: 'male' }, { text: '女', value: 'female' }, { text: '未知', value: 'unknown' }],
  gender(value) {
    const result = _.find(helper.genderArray, ['value', value])
    return result ? result.text : result
  },

  orderCategoryArray: [{ text: '试戴', value: 'try', }, { text: '验光试戴', value: 'optometry_try', }, { text: '验光', value: 'optometry', }, { text: '购买', value: 'buy', }, ],
  orderCategory(value) {
    const result = _.find(helper.orderCategoryArray, ['value', value])
    return result ? result.text : result
  },
  orderStatusObj: {
    try: [
      { text: '未付款', value: 'created' },
      { text: '已付款', value: 'paid' },
      { text: '已发货', value: 'shipping' },
      { text: '已签收', value: 'received' },
      { text: '已归还', value: 'returning' },
      { text: '已退押金', value: 'completed' },
    ],
    buy: [
      { text: '未付款', value: 'created' },
      { text: '已付款', value: 'paid' },
      { text: '已托运', value: 'shipping' },
      { text: '已签收', value: 'received' },
      { text: '已回访', value: 'completed' },
    ],
    optometry_try: [
      { text: '提交成功', value: 'created' },
      { text: '已预约', value: 'scheduled' },
      { text: '已完成', value: 'completed' },
    ],
    optometry: [
      { text: '提交成功', value: 'created' },
      { text: '已预约', value: 'scheduled' },
      { text: '已完成', value: 'completed' },
    ],
  },
  orderStatus(value, category) {
    const result = _.find(_.concat(helper.orderStatusObj[category], { text: '已取消', value: 'cancelled' }, { text: '等待取消审核', value: 'cancel_pending' }), ['value', value])
    return result ? result.text : result
  },

  productSizeArray: ['标准', '宽'],
  productGenderArray: [{ text: '男', value: '男', }, { text: '女', value: '女', }, { text: '男女通用', value: null, }],
  productShapeArray: ['圆', '方'],
  productTypeArray: ['太阳眼镜', '光学眼镜'],
  subProductStatusArray: [{ text: '正常', value: 'normal', }, { text: '隐藏', value: 'hidden', }, { text: '缺货状态', value: 'out_of_stock', }, { text: '下架', value: 'down', }, ],
  subProductStatus(value) {
    const result = _.find(helper.subProductStatusArray, ['value', value])
    return result ? result.text : result
  },
  subProductCustomLabel: ({ sku_name, name }) => `${sku_name} ${name}`,

  orderItemsTotal(orderItems) {
    return _.sumBy(orderItems, ({ sub_product_price, lens_price }) => _.toNumber(sub_product_price) + _.toNumber(lens_price))
  },

  confirm(opts, cb, close = false) {
    let conf = {
      title: '',
      text: '',
      type: 'warning',
      showCancelButton: true,
      showLoaderOnConfirm: true,
      confirmButtonText: '确定',
      cancelButtonText: '取消',
      closeOnConfirm: close
    }
    if (_.isString(opts)) {
      conf.title = opts
    } else {
      conf = _.assign(conf, opts)
    }
    swal(conf, cb)
  },

  title(val) {
    if (val) {
      document.title = val + ' - PQ'
    } else {
      document.title = 'PQ'
    }
  },
  async catchError(fn, success, error) {
    const result = await fn().catch(e => {
      let { name, message } = e
      if (name !== 'StatusError') {
        message = e
      }
      if (error) {
        _.isFunction(error) ? error(message) : notieError(message)
      } else if (name === 'StatusError') {
        notieError(message)
      } else {
        throw e
      }
    })
    if (success) {
      _.isFunction(success) ? success(result) : notieSuccess(success)
    }
    return result
  },
  StatusError(value) {
    class StatusError extends Error {
      constructor(value) {
        super(value)
        this.message = value
        this.name = 'StatusError'
      }
    }
    return new StatusError(value)
  },
  uncaughtHandler(e) {
    e.preventDefault ? e.preventDefault() : (e.returnValue = false)
    const { name, message } = e
    if (name === 'StatusError') {
      return notieError(message)
    } else {
      notieError('网页错误, 请联系管理员')
      throw e.reason
    }
  },
  // // 处理链接
  // url: (value, noprotocol) => {
  //   value = _.trim(value)
  //   if (!noprotocol && value.search(/https?:\/\//i) !== 0) {
  //     value = 'http://' + value
  //   }
  //   return value
  // },
  // // 链接精简
  // urlClear: value => {
  //   value = _.trim(value)
  //   return value.replace(/^https?:\/\//i, '')
  // },
  //
  // // 字符串转数组
  // strToArray: value => {
  //   return value.split(/[ |　]*[,|，|、]+[ |　]*/g)
  // },
  // // 数组转字符串
  // arrayToStr: value => {
  //   if (!_.isArray(value)) {
  //     return ''
  //   }
  //   return value.join('、')
  // },

  // // 删除千位分隔符
  // removeThousandsSeparators (value) {
  //   if (!value) {
  //     return value
  //   }
  //   return value.toString().replace(/[^\d\.]/g, '')
  // },
  // // 增加千位分隔符
  // addThousandsSeparators (value) {
  //   if (!value) {
  //     return value
  //   }
  //   let parts = helper.removeThousandsSeparators(value).split('.')
  //   parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',')
  //   return parts.join('.')
  // },
  // // 保留小数
  // round: (value, precision=2) => {
  //   return _.round(Number(value), precision)
  // },
  // // 获取金额的亿/万单位
  // moneyUnit: (value) => {
  //   value = Number(value)
  //   if (value >= 100000000) {
  //     return '亿'
  //   } else if (value >= 10000) {
  //     return '万'
  //   } else {
  //     return ''
  //   }
  // },
  // // 获取金额的亿/万部分
  // moneyAmount: (value, precision) => {
  //   value = Number(value)
  //   if (value >= 100000000) {
  //     value = value/100000000
  //   } else if (value >= 10000) {
  //     value = value/10000
  //   }
  //   value = helper.round(value, precision)
  //   value = helper.addThousandsSeparators(value)
  //   return value
  // },
  // 检查存在并且不为空字符串
  isAmountValid: value => {
    return typeof value !== "undefined" && value !== null && !/^\s*$/.test(value)
  },
  // 时间戳转日期
  unixToDate: (value, format = 'YYYY-MM-DD') => {
    if (!value) {
      return value
    }
    const m = moment.unix(value)
    if (!m.isValid()) {
      return '-'
    }
    return m.format(format)
  },
  // 日期转时间戳 08:00:00
  dateToUnix: (value, format = 'YYYY-MM-DD') => {
    if (!value) {
      return value
    }
    if (moment.isMoment(value) || _.isDate(value)) {
      format = undefined
    }
    const m = moment(value, format)
    if (!m.isValid()) {
      return null
    }
    return moment(m.format('YYYY-MM-DD 08:00:00')).unix()
  },
  // duration
  durationSeconds(value) {
    return moment.duration({ seconds: value }).humanize()
  },
  // // 带单位的数字转换
  // amountUnit: (value, unit='', precision, raw) => {
  //   if (!helper.isAmountValid(value)) {
  //     return '-'
  //   }
  //   if (unit === '元') {
  //     if (raw) {
  //       return helper.addThousandsSeparators(value)+unit
  //     } else {
  //       return helper.moneyAmount(value, precision)+helper.moneyUnit(value)+unit
  //     }
  //   } else {
  //     return helper.round(['万元', '万股'].includes(unit) ? value/10000 : value, precision)+unit
  //   }
  // },
  // // 大写数字
  // toAccountingNumeral (value, type) {
  //   if (!value) {
  //     return value
  //   }
  //   let accountingNumeral = new Nzh({
  //       ch: '零壹贰叁肆伍陆柒捌玖',
  //       ch_u: '个拾佰仟万亿',
  //       other: '负点',
  //       m_t: '',
  //       m_z: '整',
  //       m_u: '元角分',
  //   })
  //   if (type === 'money') {
  //     return accountingNumeral.toMoney(value)
  //   } else {
  //     return accountingNumeral.encode(value)
  //   }
  // },

}

export default _.assign(helper, validator)
